<?php

// use Illuminate\Support\Facades\Schema;
use Jialeo\LaravelSchemaExtend\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class InitOrder extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('union_orders', function (Blueprint $table) {
            $table->comment = '统一订单表';
            
            $table->increments('id');
            $table->uuid('uuid')->index() ;
            
            $table->string('prepay_id', 50)->nullable()->comment('prepay_id');
            
            $table->string('number', 100)->index()->comment('编号');

            $table->integer('user_id')->unsigned()->index()->comment('用户id');

            $table->integer('pay_money')->unsigned()->nullable()->comment('支付金额');
            $table->timestamp('paid_at')->nullable()->comment('支付时间'); // 支付时间

            $table->softDeletes();
            $table->timestamps();

        });

        Schema::create('orders', function (Blueprint $table) {
            $table->comment = '订单表';
            
            $table->increments('id');
            $table->uuid('uuid')->index() ;

            $table->integer('user_id')->unsigned()->index()->comment('用户id');   // 用户id
            $table->integer('shop_id')->unsigned()->nullable()->index()->comment('店铺id');   // 租户id
            $table->integer('union_order_id')->unsigned()->nullable()->index()->comment('联合订单id');  // 联合订单id

            // 当订单为代付订单时，有此字段
            $table->integer('host_order_id')->unsigned()->nullable()->index()->comment('当订单为代付订单时，有此字段 host 订单');  // host 订单

            $table->string('number', 50)->index()->comment('编号');

            // 订单核销码
            $table->string('code', 30)->index()->comment('订单核销码');

            // 
            $table->string('client_name', 30)->nullable()->comment('前端来源应用名');
            $table->string('client_type', 10)->nullable()->index()->comment('miniapp 小程序  pc_web 电脑网页   mobile_web 移动端   ios IOS应用  android 安卓应用 ');  // miniapp 小程序  pc_web 电脑网页   mobile_web 移动端   ios IOS应用  android 安卓应用  
            $table->string('os_type', 20)->nullable()->index()->comment('ios  android  macos ');  // ios  android  macos 
            $table->string('pay_type', 20)->nullable()->index()->comment('none无须支付 wechat alipay eth');  // wechat alipay eth
            $table->string('pay_sub_type', 20)->nullable()->index()->comment('miniapp web qrcode');  // miniapp web qrcode

            $table->string('miniapp_type', 20)->default('wechat')->index()->comment('小程序类型 默认wechat小程序');

            // $table->string('create_form_id', 50)->nullable();
            // $table->string('pay_form_id', 50)->nullable();

            // 留言及备注
            $table->string('remark', 255)->nullable()->comment(' 用户备注');   // 用户备注
            $table->string('seller_remark', 255)->nullable()->comment('卖家备注（仅卖家可见）'); // 卖家备注（仅卖家可见）
            $table->string('seller_reply', 255)->nullable()->comment('卖家回复 (用户及卖家可见)');  // 卖家回复 (用户及卖家可见)

            // 发票信息
            // 暂无

            // product及sku数量
            $table->tinyInteger('product_total')->nullable()->comment('商品总数'); // 商品总数
            // $table->tinyInteger('sku_type_total')->index(); // sku种类数
            $table->tinyInteger('sku_total')->nullable()->comment('sku总数'); // sku总数

            // 价格字段
            $table->integer('product_money_price')->unsigned()->comment('商品人民币总价');  // 商品总格
            $table->integer('product_score_price')->unsigned()->comment('商品积分总价');  // 商品总格

            // 积分佣金
            $table->integer('money_brokerage')->unsigned()->nullable()->comment('红包佣金');     // 价格
            $table->integer('score_brokerage')->unsigned()->nullable()->comment('积分佣金');     // 价格
            $table->integer('second_brokerage_money')->unsigned()->nullable()->comment('上级推广人红包佣金');   // 售价
            $table->integer('second_brokerage_score')->unsigned()->nullable()->comment('上级推广人积分佣金');   // 售价
            // 积分奖励
            $table->integer('score_reward')->unsigned()->nullable()->comment('积分奖励');     // 价格

            $table->integer('carriage')->unsigned()->default(0)->comment('运费');    // 运费

            $table->integer('vip_discount')->unsigned()->default(0)->comment('vip折扣优惠');   // vip折扣优惠
            $table->integer('score_discount')->unsigned()->default(0)->comment('积分优惠');   // 积分优惠
            $table->integer('redpack_discount')->unsigned()->default(0)->comment('红包优惠');   // 红包优惠
            $table->integer('coupon_discount')->unsigned()->default(0)->comment('优惠券优惠');   // 优惠券优惠
            $table->integer('other_discount')->unsigned()->default(0)->comment('其它优惠');   // 其它优惠
            $table->string('other_discount_remark', 100)->nullable()->comment('其它优惠说明 ');   // 其它优惠说明 

            $table->integer('order_money_price')->unsigned()->index()->comment('总价格(含运费), 扣除各项优惠');   // 总价格(含运费), 扣除各项优惠
            $table->integer('order_score_price')->unsigned()->index()->comment('总价格(含运费), 扣除各项优惠');   // 总价格(含运费), 扣除各项优惠

            // $table->integer('original_pay_price')->unsigned();   // 原本应付价格
            $table->integer('pay_money_price')->unsigned()->index()->comment('应付价格, 此价格可能已被管理员修改');   // 应付价格, 此价格可能已被管理员修改
            $table->integer('pay_score_price')->unsigned()->index()->comment('应付价格, 此价格可能已被管理员修改');   // 应付价格, 此价格可能已被管理员修改


            // 优惠券
            $table->tinyInteger('coupon_type')->nullable()->index()->comment('优惠券类型, 空为无优惠券  0为平台优惠券   1为店铺优惠券   2为微信卡券');  // 优惠券类型, 空为无优惠券  0为平台优惠券   1为店铺优惠券   2为微信卡券

            // 支付信息
            $table->tinyInteger('pay_num')->nullable()->comment('支付编号顺序号（防止下单后取消支付改价格后再支付出错问题）');
            $table->string('pay_number', 50)->index()->comment('支付编号');

            // 时间字段
            $table->timestamp('confirmed_at')->nullable()->comment('确认时间'); // 确认时间

            $table->timestamp('money_paid_at')->nullable()->comment('人民币支付时间');      // 支付时间
            $table->timestamp('score_paid_at')->nullable()->comment('积分支付时间');      // 支付时间

            $table->timestamp('delivered_at')->nullable()->comment('发货时间');  // 发货时间
            $table->timestamp('completed_at')->nullable()->comment('完成时间');  // 完成时间
            $table->timestamp('closed_at')->nullable()->comment('关闭时间');      // 关闭时间
            $table->timestamp('commented_at')->nullable()->comment('评价时间');      // 评价时间

            $table->timestamp('auto_closed_at')->nullable()->comment('将来自动关闭的时间');      // 将来自动关闭的时间
            $table->timestamp('auto_completed_at')->nullable()->comment('将来自动收货的时间');      // 将来自动关闭的时间

            $table->tinyInteger('closed_by')->nullable()->comment('0为平台管理员关闭, 1为租户管理员关闭, 2为用户关闭, 3为支付超时关闭, 4为系统风控关闭  5为拼团失败关闭');      // 0为平台管理员关闭, 1为租户管理员关闭, 2为用户关闭, 3为支付超时关闭, 4为系统风控关闭  5为拼团失败关闭   6一番赏库存不足关闭
            $table->string('closed_reason', 255)->nullable()->comment('用户自动关闭理由');      // 用户自动关闭理由

            $table->tinyInteger('is_auto_delivered')->default(0)->comment('是否自动发货');   // 是否自动发货

            $table->boolean('is_visible')->default(1)->index()->comment('是否用户可见');   // 是否用户可见

            $table->string('type', 15)->nullable()->index()->comment('null为普通订单， 预留给扩展其它订单使用，如：付费视频订单，付费音频订单');   // null为普通订单， 预留给扩展其它订单使用，如：付费视频订单，付费音频订单

            // 此字段已更改
            $table->tinyInteger('activity_type')->default(1)->index()->comment('1为普通购买  2为团购  3为砍价  4为秒杀  5为集赞'); // 1为普通购买  2为团购  3为砍价  4为秒杀  5为集赞

            $table->tinyInteger('product_type')->default(0)->index()->comment('0为实物   1为虚拟');   // 0为实物   1为虚拟

            // 状态字段
            $table->tinyInteger('status')->default(0)->index()->comment('0为未确认, 1进行中订单, 2已关闭订单,  3未发货申请取消中  4申请售后中  5售后完成  9已完成订单  6为已兑换  7待处理   8已返售');   // 0为未确认, 1进行中订单, 2已关闭订单,  3未发货申请取消中  4申请售后中  5售后完成 9已完成订单   7待处理   8已返售

            $table->tinyInteger('activity_status')->default(0)->index()->comment('0为无活动  1为活动任务进行中   2活动任务已完成   3活动任务已取消  ');   // 0为无活动  1为活动任务进行中   2活动任务已完成   3活动任务已取消    4活动任务超时

            $table->tinyInteger('invoice_status')->default(0)->index()->comment('0为未申请发票  1为发票申请中   2发票已寄出');   // 0为未申请发票  1为发票申请中   2发票已寄出

            $table->tinyInteger('pay_status')->default(0)->index()->comment('0为未支付, 1为付款确认中, 2为已付款, 3不需要支付');   // 0为未支付, 1为付款确认中, 2为已付款    

            $table->tinyInteger('deliver_status')->default(0)->index()->comment('0为待发货,  1为备货中,  2部分发货,  3已发货  4已核销 5不需要发货');   // 0为待发货,  1为备货中,  2部分发货,  3已发货  4已核销 
            $table->tinyInteger('aftersale_status')->default(0)->index()->comment('0为无售后 1为售后中 2为售后完成 3售后关闭');   // 0为无售后 1为售后中 2为售后完成 3售后关闭

            $table->integer('coupon_id')->nullable()->index()->comment('使用优惠券的id');   // 0为无售后 1为售后中 2为售后完成 3售后关闭

            $table->json('options')->nullable()->comment('options');      // options

            $table->timestamp('user_deleted_at')->nullable()->index()->comment('用户删除时间'); // 用户删除

            $table->timestamp('offline_use_at')->nullable()->index()->comment('核销时间'); // 用户删除

            $table->timestamp('marked_at')->nullable()->index()->comment('商家标记时间'); // 商家标记的

            $table->softDeletes();
            $table->timestamps();
            
            $table->foreign('union_order_id')->references('id')->on('union_orders')
                ->onUpdate('cascade')->onDelete('cascade');
        });

        Schema::create('order_skus', function (Blueprint $table) {
            $table->comment = '订单sku表';
            
            $table->increments('id');
            $table->uuid('uuid')->nullable() ;

            $table->integer('order_id')->unsigned()->index()->comment('订单id');
            // $table->integer('user_id')->unsigned()->index();
            // $table->integer('shop_id')->unsigned()->nullable()->index();

            $table->integer('activity_id')->nullable()->index()->comment('活动id');

            $table->integer('sku_id')->unsigned()->index()->comment('锚定的"sku"的id。 此处sku可能为商品的sku，也可能为电影中一个付费场次');   // 锚定的"sku"的id。 此处sku可能为商品的sku，也可能为电影中一个付费场次， 
            $table->uuid('sku_uuid')->comment('sku uuid');
            $table->uuid('product_uuid')->nullable()->comment('product uuid');
            $table->string('product_type', 30)->nullable()->comment('商品类型/product、box');

            $table->string('title', 100)->comment('标题');
            $table->string('number', 100)->nullable()->comment('编号');
            $table->string('thumb', 255)->nullable()->comment('封面');

            $table->integer('weight')->unsigned()->nullable()->comment('sku重量'); // sku重量
            $table->json('attrs')->nullable()->comment('sku属性');

            $table->integer('money_price')->unsigned()->nullable()->comment('原价');  // 原价
            $table->integer('score_price')->unsigned()->nullable()->comment('积分原价');  // 积分价格

            $table->integer('discount_money_price')->unsigned()->nullable()->comment('人民售价');   // 售价
            $table->integer('discount_score_price')->unsigned()->nullable()->comment('积分售价');   // 售价

            $table->integer('brokerage_money')->unsigned()->nullable()->comment('推广红包奖励');   // 售价
            $table->integer('brokerage_score')->unsigned()->nullable()->comment('推广积分奖励');   // 售价
            $table->integer('second_brokerage_money')->unsigned()->nullable()->comment('上级推广人红包佣金');   // 售价
            $table->integer('second_brokerage_score')->unsigned()->nullable()->comment('上级推广人积分佣金');   // 售价
            
            $table->integer('reward_money')->unsigned()->nullable()->comment('商品奖励红包');  
            $table->integer('reward_score')->unsigned()->nullable()->comment('商品奖励积分');  

            $table->integer('total')->unsigned()->comment('sku数量'); // sku数量

            $table->softDeletes();
            $table->timestamps();

            $table->foreign('order_id')->references('id')->on('orders')
                ->onUpdate('cascade')->onDelete('cascade');
        });

        Schema::create('order_address', function (Blueprint $table) {
            $table->comment = '订单地址表';
            
            $table->increments('id');
            $table->uuid('uuid')->nullable();
            $table->integer('order_id')->unsigned()->index()->comment('订单id');

            $table->char('area_code', 10)->nullable()->comment('地区码');
            
            $table->string('country', 100)->nullable()->comment('国家');
            $table->string('province', 100)->nullable()->comment('省份');
            $table->string('city', 100)->nullable()->comment('城市');
            $table->string('district', 100)->nullable()->comment('地区');
            $table->string('address', 100)->nullable()->comment('详细地址');

            $table->string('consignee', 100)->nullable()->comment('收件人'); // 收件人
            $table->string('phone', 30)->nullable()->comment('手机号');
            $table->string('tel', 50)->nullable()->comment('电话');
            $table->string('zipcode', 30)->nullable()->comment('邮编');

            $table->softDeletes();
            $table->timestamps();

            $table->foreign('order_id')->references('id')->on('orders')
                ->onUpdate('cascade')->onDelete('cascade');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::disableForeignKeyConstraints();
        Schema::dropIfExists('order_skus');
        Schema::dropIfExists('order_address');
        Schema::dropIfExists('orders');
        Schema::dropIfExists('union_orders');
    }
}
